package saa.controller;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import saa.dao.CursoDAO;
import saa.dao.usuario.AlunoDAOInterface;
import saa.dao.periodo.tempo.BimestreDAOInterface;
import saa.dao.periodo.aluno.OfertaDisciplinaAlunoDAOInterface;
import saa.dao.PopularBancoInterface;
import saa.dominio.Curso;
import saa.dominio.disciplina.Disciplina;
import saa.dominio.periodo.OfertaDisciplina;
import saa.dominio.periodo.aluno.AvaliacaoAluno;
import saa.dominio.periodo.aluno.OfertaDisciplinaAluno;
import saa.dominio.periodo.aluno.UnidadeDisciplinaAluno;
import saa.dominio.periodo.tempo.Ano;
import saa.dominio.periodo.tempo.Bimestre;
import saa.dominio.periodo.tempo.Semestre;
import saa.dominio.usuario.Aluno;
import saa.dominio.usuario.Usuario;
import saa.dto.NotasDTO;
import saa.fachada.OfertaAlunoFachada;
import saa.negocio.Calculador;

@ManagedBean(name = "usuarioController")
@SessionScoped
public class UsuarioController implements Serializable {

    @EJB
    private AlunoDAOInterface alunoDAO;
    @EJB
    private OfertaDisciplinaAlunoDAOInterface ofertaDisciplinaAlunoDAO;
    @EJB
    private BimestreDAOInterface bimestreDAO;
    @EJB
    private PopularBancoInterface popularBanco;
    @EJB
    private OfertaAlunoFachada ofertaAlunoFachada;
    @EJB
    private CursoDAO cursoDAO;

    private Usuario usuario;
    
    private Aluno aluno;

    public UsuarioController() {
        super();
    }

    public String teste() {

//        popularBanco.popularBanco();
//        popularBanco.alterarBanco();
//        popularBanco.inserirNota();

        Aluno aluno = alunoDAO.buscar(1);

        Usuario usuario = aluno.getUsuario();

        String s = "Aluno: " + usuario.getNome() + "<br />";
//        s += "email: " + usuario.getEmail() + "<br />";
//        s += "senha: " + usuario.getSenha() + "<br />";

//        s += "Objetivo Nota: " + aluno.getObjetivoNota() + "<br />";
//        s += "Objetivo Presença: " + aluno.getObjetivoPercentualPresencas() + "%<br /><br />";
        Curso curso = aluno.getCurso();

//        s += "Curso: " + curso.getNome() + "<br />";
//        s += "Coordenador: " + curso.getCoordenador().getUsuario().getNome() + "<br />";
//        s += "Nota Mínima: " + curso.getNotaMinimaParaPassar() + "<br />";
//        s += "Percentual Mínimo de Presença: " + curso.getPercentualPresencaMinimo() + "<br />";
//        s += "Nota Mínima para Recuperação: " + curso.getNotaMinimaParaRecuperacao() + "<br /><br />";
        OfertaDisciplinaAluno ofertaAluno = ofertaDisciplinaAlunoDAO.listar(aluno.getId()).get(0);
        OfertaDisciplina oferta = ofertaAluno.getOfertaDisciplina();
        Disciplina disciplina = oferta.getDisciplina();

        s += "Disciplina: " + disciplina.getNome() + "<br />";
        s += "Carga Horária: " + disciplina.getCargaHorariaRelogio() + "h<br />";
        s += "Qtd. Aulas: " + disciplina.getCargaHorariaAula() + "<br /><br />";

        Semestre semestre = oferta.getSemestre();
        Ano ano = semestre.getAno();
        SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");

//        s += "Ano: " + ano.getAno() + " (" + formatoData.format(ano.getInicio()) + " a " + formatoData.format(ano.getFim()) + ")<br />";
//        s += "Semestre: " + formatoData.format(semestre.getInicio()) + " a " + formatoData.format(semestre.getFim()) + ")<br />";
//        s += "Nota: " + ofertaAluno.getNota() + " | " + "Objetivo Nota: " + ofertaAluno.getObjetivoNota() + "<br />";
//        s += "Presenças: " + ofertaAluno.getPresencas() + " | " + "Objetivo Presenças: " + ofertaAluno.getObjetivoPresencas() + "<br /><br />";
        List<Bimestre> bimestres = bimestreDAO.listar(semestre.getId());
        Bimestre primeiroBimestre = bimestres.get(0);
        Bimestre segundoBimestre = bimestres.get(1);

        List<UnidadeDisciplinaAluno> unidades = ofertaAluno.getBimestres();
        UnidadeDisciplinaAluno primeiraUnidade = unidades.get(0);
        UnidadeDisciplinaAluno segundaUnidade = unidades.get(1);

        s += "1º Bimestre: " + formatoData.format(primeiroBimestre.getInicio()) + " a " + formatoData.format(primeiroBimestre.getFim()) + "<br />";
        s += "Nota: " + primeiraUnidade.getNota() + " | " + "Objetivo Nota: " + primeiraUnidade.getObjetivoNota() + "<br />";
        s += "Presenças: " + primeiraUnidade.getPresencas() + " | " + "Objetivo Presenças: " + primeiraUnidade.getObjetivoPresencas() + "(" + aluno.getObjetivoPercentualPresencas() + "%)" + "<br /><br />";

        int reducaoNota = 0, totalPesos = 0, reducaoPesos = 0, notaParcial = 0, objetivoNota;

        List<AvaliacaoAluno> avaliacoesPrimeiraUnidade = ofertaAlunoFachada.listar(primeiraUnidade.getId());
        List<AvaliacaoAluno> avaliacoesSegundaUnidade = ofertaAlunoFachada.listar(segundaUnidade.getId());

        NotasDTO notasPrimeiraUnidade = Calculador.calcularNotas(avaliacoesPrimeiraUnidade, primeiraUnidade.getObjetivoNota());

        // expor objetivo
        for (AvaliacaoAluno avaliacaoAluno : avaliacoesPrimeiraUnidade) {
            s += "Avaliaçao do dia: " + formatoData.format(avaliacaoAluno.getAvaliacao().getDataAvaliacao()) + " | Peso: " + avaliacaoAluno.getAvaliacao().getPeso() + " | ";
            if (avaliacaoAluno.getNota() > 0) {
                s += "Nota: " + avaliacaoAluno.getNota() + "<br />";
            } else {
                s += "Objetivo Nota: " + notasPrimeiraUnidade.notaMinima + "+<br />";
            }
        }
        s += "Nota parcial do 1º bimestre: " + notasPrimeiraUnidade.notaParcial + " (" + notasPrimeiraUnidade.notaMaximaParcial + ")" + "<br /><br />";

//        s += "2º Bimestre: " + formatoData.format(segundoBimestre.getInicio()) + " a " + formatoData.format(segundoBimestre.getFim()) + "<br />";
//        s += "Nota: " + segundaUnidade.getNota() + " | " + "Objetivo Nota: " + segundaUnidade.getObjetivoNota() + "<br />";
//        s += "Presenças: " + segundaUnidade.getPresencas() + " | " + "Objetivo Presenças: " + segundaUnidade.getObjetivoPresencas() + "<br /><br />";
//        
//        if (avaliacoesSegundaUnidade != null && avaliacoesSegundaUnidade.size() != 0) {
//            // calcular objetivo
//            for (AvaliacaoAluno avaliacaoAluno : avaliacoesSegundaUnidade) {
//                 if (avaliacaoAluno.getNota() > 0) {
//                    int peso = avaliacaoAluno.getAvaliacao().getPeso();
//                    reducaoPesos += peso;
//                    totalPesos += peso;
//                    reducaoNota += avaliacaoAluno.getNota() * peso;
//                } else {
//                    totalPesos += avaliacaoAluno.getAvaliacao().getPeso();
//                }
//            }
//
//            objetivoNota = (int) Math.ceil((double) ((primeiraUnidade.getObjetivoNota() * totalPesos) - reducaoNota) / (double) (totalPesos - reducaoPesos));
//
//            // expor objetivo
//            for (AvaliacaoAluno avaliacaoAluno : avaliacoesSegundaUnidade) {
//                s += "Avaliaçao do dia: " + formatoData.format(avaliacaoAluno.getAvaliacao().getDataAvaliacao()) + " | Peso: " + avaliacaoAluno.getAvaliacao().getPeso() + " | ";
//                if (avaliacaoAluno.getNota() > 0) {
//                    s += "Nota: " + avaliacaoAluno.getNota() + "<br />";
//                } else {
//                    s += "Objetivo Nota: " + objetivoNota + "<br />";
//                }
//            }
//            s += "<br />";
//        }
        return s;
    }

    public List<Aluno> perfisAluno() {
        List<Aluno> perfis = alunoDAO.buscarPerfisUsuario(this.usuario.getId());
        if (perfis != null) {
            return perfis;
        }
        return new ArrayList<Aluno>();
    }

    public boolean associar(Curso curso) {
        return alunoDAO.adicionar(new Aluno(this.usuario, curso));
    }

    public List<Curso> cursos() {
        return cursoDAO.listar();
    }
    
    public String loginAluno(Usuario usuario, Curso curso){
        aluno = alunoDAO.buscar(usuario.getId(), curso.getId());
        return "ok";
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }
}
